AdGuard Home in Docker installieren
Wenn du AdGuard in Docker installieren möchtest, bekommst du mit AdGuard Home einen eigenen DNS-Filter für dein Netzwerk. Der blockiert Werbung, Tracker und andere Nervensägen direkt auf DNS-Ebene. Also bevor Smartphone, Notebook, Smart-TV oder sonstige Geräte überhaupt eine Verbindung zu bestimmten Domains aufbauen.
Ich mag an der Lösung vor allem zwei Dinge: Du brauchst keine Browser-Erweiterung auf jedem Gerät und du siehst ziemlich schnell, welche Geräte im Netzwerk wohin telefonieren wollen. Das ist manchmal spannend. Und manchmal möchte man danach kurz einen Kaffee holen und nicht weiter darüber nachdenken.
In diesem Beitrag zeige ich dir, wie du AdGuard Home mit Docker Compose installierst, welche Ports wichtig sind und was du tun kannst, wenn Port 53 auf deinem System bereits belegt ist. Genau dieser Punkt ist nämlich der Klassiker bei DNS-Diensten in Docker.
🧠 Was AdGuard Home eigentlich macht
AdGuard Home ist ein DNS-Server mit Filterfunktion. Deine Geräte fragen also nicht mehr direkt irgendeinen DNS-Server im Internet, sondern zuerst deine eigene AdGuard-Instanz. AdGuard prüft die Anfrage gegen Filterlisten und entscheidet dann, ob die Domain erlaubt oder geblockt wird.
Das funktioniert netzwerkweit. Wenn du AdGuard später in deinem Router als DNS-Server einträgst, nutzen alle Geräte im Netzwerk automatisch diesen Filter. Zumindest alle Geräte, die sich an die DNS-Einstellungen halten. Manche Smart-Geräte haben da ihren eigenen Kopf. Überraschung: natürlich immer die Geräte, bei denen man es am wenigsten gebrauchen kann.
Praktisch ist außerdem die Weboberfläche. Dort siehst du Abfragen, Top-Clients, geblockte Domains und kannst eigene Regeln setzen. Für ein Heimnetz oder ein kleines Büro ist das eine sehr angenehme Mischung aus Kontrolle und Übersicht.
🧩 Voraussetzungen
Bevor es losgeht, brauchst du natürlich eine funktionierende Docker-Umgebung.
Wenn du Docker noch nicht installiert hast, findest du hier eine Schritt-für-Schritt-Anleitung, wie du das auf Ubuntu mit einem Script erledigst:
Sobald Docker läuft, kann es direkt weitergehen.
Außerdem solltest du die IP-Adresse deines Docker-Hosts kennen und möglichst fest vergeben. Ein DNS-Server mit wechselnder IP ist ungefähr so praktisch wie ein Schlüsselbund ohne Schlüssel.
🔎 Wichtige Ports für AdGuard Home
AdGuard Home kann mehrere Dienste bereitstellen. Für den normalen Start brauchst du aber nicht alles. Wichtig sind zuerst diese Ports:
- 53 TCP/UDP: DNS-Abfragen
- 3000 TCP: erster Aufruf und Weboberfläche, wenn du sie so konfigurierst
- 80/443 TCP: optional für die Weboberfläche oder DNS-over-HTTPS
- 853 TCP: optional für DNS-over-TLS
Ich halte das Compose bewusst schlank und nutze für die Weboberfläche Port 3000. Wenn bei dir bereits ein Reverse Proxy auf 80 und 443 läuft, musst du diese Ports nicht zusätzlich in AdGuard belegen.
🐳 AdGuard in Docker installieren
Ich lege mir für solche Dienste gerne einen eigenen Ordner an. Das bleibt übersichtlich und macht Backups später deutlich angenehmer.
Projektordner erstellen
mkdir -p /home/docker-container/adguardhome/data/{work,conf}
cd /home/docker-container/adguardhome
Docker-Compose Datei anlegen
Danach erstellst du die docker-compose.yaml:
---
services:
adguardhome:
image: adguard/adguardhome:v0.107.77
container_name: adguardhome
hostname: adguardhome
restart: unless-stopped
volumes:
- ./data/work:/opt/adguardhome/work
- ./data/conf:/opt/adguardhome/conf
ports:
- "53:53/tcp"
- "53:53/udp"
- "3000:3000/tcp"
Hinweis: Wenn du immer automatisch die neueste stabile Version ziehen möchtest, kannst du statt
v0.107.77auchlatestverwenden. Ich pinne Versionen aber gerne bewusst, damit ein Update nicht heimlich nebenbei passiert.
Container starten
docker compose pull docker compose up -d docker compose logs -f
Wenn alles sauber läuft, erreichst du die Ersteinrichtung über:
http://DEINE-SERVER-IP:3000
⚠️ Wenn Port 53 bereits belegt ist
Jetzt kommt der Teil, der gerne für Stirnfalten sorgt. Auf vielen Linux-Systemen läuft systemd-resolved und lauscht auf 127.0.0.53:53. Wenn Docker dann versucht, Port 53 auf allen Interfaces zu binden, kann der Start mit dieser Meldung scheitern:
failed to bind host port 0.0.0.0:53/tcp: address already in use
Genau das hatte ich beim Test auf meinem dev02. Der direkte Port-Mount 53:53 ist fehlgeschlagen, obwohl kein anderer Docker-Container auf Port 53 lief.
Variante 1: AdGuard nur an die Server-IP binden
Das ist aus meiner Sicht die angenehmste Lösung. Du bindest Port 53 nicht auf alle Interfaces, sondern nur auf die echte IP-Adresse deines Servers im Netzwerk.
Die IP bekommst du zum Beispiel so heraus:
ip -4 route get 1.1.1.1
Danach passt du im Compose die beiden DNS-Portzeilen an. Beispiel mit 192.168.178.20:
ports: - "192.168.178.20:53:53/tcp" - "192.168.178.20:53:53/udp" - "3000:3000/tcp"
Damit bleibt systemd-resolved auf localhost in Ruhe, und AdGuard beantwortet DNS-Anfragen über die Server-IP im Netzwerk. Auf dev02 ist diese Variante direkt gestartet.
Variante 2: DNSStubListener deaktivieren
Wenn du AdGuard wirklich auf allen Interfaces mit 53:53 betreiben möchtest, kannst du den lokalen DNS-Stub von systemd-resolved deaktivieren. Bitte nur machen, wenn du weißt, was du tust. DNS kaputt zu konfigurieren ist erstaunlich einfach. Frag nicht.
sudo mkdir -p /etc/systemd/resolved.conf.d sudo nano /etc/systemd/resolved.conf.d/no-stub.conf
Inhalt:
[Resolve] DNSStubListener=no
Danach:
sudo systemctl restart systemd-resolved sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Ich persönlich würde zuerst Variante 1 nehmen. Die ist einfacher, sauber nachvollziehbar und reicht in den meisten Setups völlig aus.
⚙️ Ersteinrichtung im Browser
Beim ersten Aufruf führt dich AdGuard durch einen kleinen Assistenten. Dort legst du unter anderem die Weboberfläche, den DNS-Port und deinen Admin-Benutzer fest.
Meine Empfehlung für den Anfang:
- Weboberfläche auf
0.0.0.0und Port3000lassen oder bewusst so setzen - DNS-Server auf
0.0.0.0und Port53setzen - starkes Passwort für den Admin-Benutzer verwenden
- nach der Einrichtung die Upstream-DNS-Server prüfen
Als Upstream kannst du zum Beispiel Quad9, Cloudflare oder einen anderen DNS-Anbieter deiner Wahl nutzen. Wenn dir Datenschutz wichtig ist, lohnt sich ein Blick auf DNS-over-HTTPS oder DNS-over-TLS. Für den Start reicht aber auch ein normales, stabiles DNS-Setup.

📡 AdGuard im Netzwerk nutzen
Nach der Installation muss dein Netzwerk natürlich auch wissen, dass es AdGuard nutzen soll. Am saubersten trägst du die IP deines Docker-Hosts im Router als DNS-Server ein.
Bei einer Fritzbox findest du die passenden Einstellungen je nach Firmware an zwei Stellen: einmal für den Internet-DNS und einmal für den lokalen DNS-Server per DHCP. Für ein Heimnetz ist der DHCP-DNS meistens der spannende Teil, weil deine Clients darüber automatisch die richtige DNS-Adresse bekommen.
Danach hilft ein kurzer Test von einem Client:
nslookup cleveradmin.de 192.168.178.20
Wenn eine Antwort kommt, ist der DNS-Server grundsätzlich erreichbar. In der AdGuard-Oberfläche solltest du die Anfrage dann auch im Query Log sehen. Das ist immer der schöne Moment, an dem man weiß: Okay, es lebt.
🧪 Kleine Checkliste nach der Installation
- Container läuft mit
docker compose ps - Weboberfläche ist über
http://SERVER-IP:3000erreichbar - Port 53 ist auf TCP und UDP erreichbar
- Router verteilt die AdGuard-IP per DHCP als DNS-Server
- Query Log zeigt Anfragen deiner Clients
- Filterlisten sind aktiviert und werden regelmäßig aktualisiert
Wenn du danach noch einzelne Domains erlauben oder blockieren möchtest, geht das direkt über die Oberfläche. Gerade eigene Allowlist-Einträge sind praktisch, wenn eine Webseite wegen Tracking-Skripten plötzlich meint, sie müsse beleidigt in der Ecke stehen.
✅ Mein Fazit
AdGuard Home ist mit Docker schnell installiert und macht im Alltag genau das, was ich von so einem Dienst erwarte: unauffällig laufen, sauber filtern und bei Bedarf nachvollziehbar zeigen, was im Netzwerk passiert.
Der wichtigste Stolperstein ist Port 53. Wenn der bereits durch systemd-resolved belegt ist, musst du nicht direkt das halbe System umbauen. Binde AdGuard einfach an die konkrete Server-IP. Das ist oft die einfachste und stabilste Lösung.
Danach noch den Router passend konfigurieren, Query Log prüfen und fertig. Kein Hexenwerk, aber ein sehr nützliches kleines Stück Infrastruktur.
👥 Techniverse Community
Lust auf Austausch rund um Matrix, Selfhosting und andere smarte IT-Lösungen?
In der Techniverse Community triffst du Gleichgesinnte, kannst Fragen stellen oder einfach nerdigen Talk genießen. 🚀
👉 Jetzt der Gruppe auf Matrix beitreten
~ Direkte Raumadresse: #community:techniverse.net
👉 Für lockere Gespräche abseits der Kernthemen komm in den Talkraum
~ Direkte Raumadresse: #talk:techniverse.net
Wir freuen uns, wenn du dabei bist!




